import Formatter from '../core/Formatter';
import Tokenizer from '../core/Tokenizer';

const reservedWords = [
  'AES128',
  'AES256',
  'ALLOWOVERWRITE',
  'ANALYSE',
  'ARRAY',
  'AS',
  'ASC',
  'AUTHORIZATION',
  'BACKUP',
  'BINARY',
  'BLANKSASNULL',
  'BOTH',
  'BYTEDICT',
  'BZIP2',
  'CAST',
  'CHECK',
  'COLLATE',
  'COLUMN',
  'CONSTRAINT',
  'CREATE',
  'CREDENTIALS',
  'CURRENT_DATE',
  'CURRENT_TIME',
  'CURRENT_TIMESTAMP',
  'CURRENT_USER',
  'CURRENT_USER_ID',
  'DEFAULT',
  'DEFERRABLE',
  'DEFLATE',
  'DEFRAG',
  'DELTA',
  'DELTA32K',
  'DESC',
  'DISABLE',
  'DISTINCT',
  'DO',
  'ELSE',
  'EMPTYASNULL',
  'ENABLE',
  'ENCODE',
  'ENCRYPT',
  'ENCRYPTION',
  'END',
  'EXPLICIT',
  'FALSE',
  'FOR',
  'FOREIGN',
  'FREEZE',
  'FULL',
  'GLOBALDICT256',
  'GLOBALDICT64K',
  'GRANT',
  'GZIP',
  'IDENTITY',
  'IGNORE',
  'ILIKE',
  'INITIALLY',
  'INTO',
  'LEADING',
  'LOCALTIME',
  'LOCALTIMESTAMP',
  'LUN',
  'LUNS',
  'LZO',
  'LZOP',
  'MINUS',
  'MOSTLY13',
  'MOSTLY32',
  'MOSTLY8',
  'NATURAL',
  'NEW',
  'NULLS',
  'OFF',
  'OFFLINE',
  'OFFSET',
  'OLD',
  'ON',
  'ONLY',
  'OPEN',
  'ORDER',
  'OVERLAPS',
  'PARALLEL',
  'PARTITION',
  'PERCENT',
  'PERMISSIONS',
  'PLACING',
  'PRIMARY',
  'RAW',
  'READRATIO',
  'RECOVER',
  'REFERENCES',
  'REJECTLOG',
  'RESORT',
  'RESTORE',
  'SESSION_USER',
  'SIMILAR',
  'SYSDATE',
  'SYSTEM',
  'TABLE',
  'TAG',
  'TDES',
  'TEXT255',
  'TEXT32K',
  'THEN',
  'TIMESTAMP',
  'TO',
  'TOP',
  'TRAILING',
  'TRUE',
  'TRUNCATECOLUMNS',
  'UNIQUE',
  'USER',
  'USING',
  'VERBOSE',
  'WALLET',
  'WHEN',
  'WITH',
  'WITHOUT',
  'PREDICATE',
  'COLUMNS',
  'COMPROWS',
  'COMPRESSION',
  'COPY',
  'FORMAT',
  'DELIMITER',
  'FIXEDWIDTH',
  'AVRO',
  'JSON',
  'ENCRYPTED',
  'BZIP2',
  'GZIP',
  'LZOP',
  'PARQUET',
  'ORC',
  'ACCEPTANYDATE',
  'ACCEPTINVCHARS',
  'BLANKSASNULL',
  'DATEFORMAT',
  'EMPTYASNULL',
  'ENCODING',
  'ESCAPE',
  'EXPLICIT_IDS',
  'FILLRECORD',
  'IGNOREBLANKLINES',
  'IGNOREHEADER',
  'NULL AS',
  'REMOVEQUOTES',
  'ROUNDEC',
  'TIMEFORMAT',
  'TRIMBLANKS',
  'TRUNCATECOLUMNS',
  'COMPROWS',
  'COMPUPDATE',
  'MAXERROR',
  'NOLOAD',
  'STATUPDATE',
  'MANIFEST',
  'REGION',
  'IAM_ROLE',
  'MASTER_SYMMETRIC_KEY',
  'SSH',
  'ACCEPTANYDATE',
  'ACCEPTINVCHARS',
  'ACCESS_KEY_ID',
  'SECRET_ACCESS_KEY',
  'AVRO',
  'BLANKSASNULL',
  'BZIP2',
  'COMPROWS',
  'COMPUPDATE',
  'CREDENTIALS',
  'DATEFORMAT',
  'DELIMITER',
  'EMPTYASNULL',
  'ENCODING',
  'ENCRYPTED',
  'ESCAPE',
  'EXPLICIT_IDS',
  'FILLRECORD',
  'FIXEDWIDTH',
  'FORMAT',
  'IAM_ROLE',
  'GZIP',
  'IGNOREBLANKLINES',
  'IGNOREHEADER',
  'JSON',
  'LZOP',
  'MANIFEST',
  'MASTER_SYMMETRIC_KEY',
  'MAXERROR',
  'NOLOAD',
  'NULL AS',
  'READRATIO',
  'REGION',
  'REMOVEQUOTES',
  'ROUNDEC',
  'SSH',
  'STATUPDATE',
  'TIMEFORMAT',
  'SESSION_TOKEN',
  'TRIMBLANKS',
  'TRUNCATECOLUMNS',
  'EXTERNAL',
  'DATA CATALOG',
  'HIVE METASTORE',
  'CATALOG_ROLE',
  'VACUUM',
  'COPY',
  'UNLOAD',
  'EVEN',
  'ALL',
];

const reservedTopLevelWords = [
  'ADD',
  'AFTER',
  'ALTER COLUMN',
  'ALTER TABLE',
  'DELETE FROM',
  'EXCEPT',
  'FROM',
  'GROUP BY',
  'HAVING',
  'INSERT INTO',
  'INSERT',
  'INTERSECT',
  'TOP',
  'LIMIT',
  'MODIFY',
  'ORDER BY',
  'SELECT',
  'SET CURRENT SCHEMA',
  'SET SCHEMA',
  'SET',
  'UNION ALL',
  'UNION',
  'UPDATE',
  'VALUES',
  'WHERE',
  'VACUUM',
  'COPY',
  'UNLOAD',
  'ANALYZE',
  'ANALYSE',
  'DISTKEY',
  'SORTKEY',
  'COMPOUND',
  'INTERLEAVED',
  'FORMAT',
  'DELIMITER',
  'FIXEDWIDTH',
  'AVRO',
  'JSON',
  'ENCRYPTED',
  'BZIP2',
  'GZIP',
  'LZOP',
  'PARQUET',
  'ORC',
  'ACCEPTANYDATE',
  'ACCEPTINVCHARS',
  'BLANKSASNULL',
  'DATEFORMAT',
  'EMPTYASNULL',
  'ENCODING',
  'ESCAPE',
  'EXPLICIT_IDS',
  'FILLRECORD',
  'IGNOREBLANKLINES',
  'IGNOREHEADER',
  'NULL AS',
  'REMOVEQUOTES',
  'ROUNDEC',
  'TIMEFORMAT',
  'TRIMBLANKS',
  'TRUNCATECOLUMNS',
  'COMPROWS',
  'COMPUPDATE',
  'MAXERROR',
  'NOLOAD',
  'STATUPDATE',
  'MANIFEST',
  'REGION',
  'IAM_ROLE',
  'MASTER_SYMMETRIC_KEY',
  'SSH',
  'ACCEPTANYDATE',
  'ACCEPTINVCHARS',
  'ACCESS_KEY_ID',
  'SECRET_ACCESS_KEY',
  'AVRO',
  'BLANKSASNULL',
  'BZIP2',
  'COMPROWS',
  'COMPUPDATE',
  'CREDENTIALS',
  'DATEFORMAT',
  'DELIMITER',
  'EMPTYASNULL',
  'ENCODING',
  'ENCRYPTED',
  'ESCAPE',
  'EXPLICIT_IDS',
  'FILLRECORD',
  'FIXEDWIDTH',
  'FORMAT',
  'IAM_ROLE',
  'GZIP',
  'IGNOREBLANKLINES',
  'IGNOREHEADER',
  'JSON',
  'LZOP',
  'MANIFEST',
  'MASTER_SYMMETRIC_KEY',
  'MAXERROR',
  'NOLOAD',
  'NULL AS',
  'READRATIO',
  'REGION',
  'REMOVEQUOTES',
  'ROUNDEC',
  'SSH',
  'STATUPDATE',
  'TIMEFORMAT',
  'SESSION_TOKEN',
  'TRIMBLANKS',
  'TRUNCATECOLUMNS',
  'EXTERNAL',
  'DATA CATALOG',
  'HIVE METASTORE',
  'CATALOG_ROLE',
];

const reservedTopLevelWordsNoIndent = [];

const reservedNewlineWords = [
  'AND',
  'ELSE',
  'OR',
  'OUTER APPLY',
  'WHEN',
  'VACUUM',
  'COPY',
  'UNLOAD',
  'ANALYZE',
  'ANALYSE',
  'DISTKEY',
  'SORTKEY',
  'COMPOUND',
  'INTERLEAVED',
  // joins
  'JOIN',
  'INNER JOIN',
  'LEFT JOIN',
  'LEFT OUTER JOIN',
  'RIGHT JOIN',
  'RIGHT OUTER JOIN',
  'FULL JOIN',
  'FULL OUTER JOIN',
  'CROSS JOIN',
  'NATURAL JOIN',
];

export default class RedshiftFormatter extends Formatter {
  tokenizer() {
    return new Tokenizer({
      reservedWords,
      reservedTopLevelWords,
      reservedNewlineWords,
      reservedTopLevelWordsNoIndent,
      stringTypes: [`""`, "''", '``'],
      openParens: ['('],
      closeParens: [')'],
      indexedPlaceholderTypes: ['?'],
      namedPlaceholderTypes: ['@', '#', '$'],
      lineCommentTypes: ['--'],
      operators: ['|/', '||/', '<<', '>>', '!=', '||'],
    });
  }
}
